using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;

namespace ApplicationTemplate
{
    /// <summary>
    /// データベースマネージャクラスです<br />
    /// </summary>
    public class DBManager : IDisposable
    {
        private DbTransaction _DbTransaction = null;

        /// <summary>
        /// トランザクションオブジェクト
        /// </summary>
        public DbTransaction Transaction { get { return _DbTransaction; } }

        /// <summary>
        /// コネクションオブジェクト
        /// </summary>
        private DbConnection _DbConnection = null;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public DBManager()
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public DBManager(DbConnection connection)
        {
            _DbConnection = connection;
        }

        /// <summary>
        /// トランザクション開始
        /// </summary>
        public void BeginTransaction()
        {
            _DbConnection.Open();
            _DbTransaction = _DbConnection.BeginTransaction();
        }

        /// <summary>
        /// 分離レベルを指定してトランザクション開始
        /// </summary>
        /// <param name="isolationLevel">トランザクションの分離レベル</param>
        public void BeginTransaction(IsolationLevel isolationLevel)
        {
            _DbConnection.Open();
            _DbTransaction = _DbConnection.BeginTransaction(isolationLevel);
        }

        /// <summary>
        /// コミット
        /// </summary>
        public void Commit()
        {
            _DbTransaction.Commit();
            _DbConnection.Close();
        }

        /// <summary>
        /// ロールバック
        /// </summary>
        public void Rollback()
        {
            if (_DbTransaction != null)
            {
                _DbTransaction.Rollback();
            }
            if (_DbConnection != null)
            {
                _DbConnection.Close();
            }
        }

        /// <summary>
        /// トランザクション中かどうか判断する<br />
        /// [true]トランザクション中　[false]トランザクションなし
        /// </summary>
        public Boolean IsTransaction()
        {
            // トランザクションオブジェクトが存在し、かつトランザクショ
            return (_DbTransaction != null && _DbTransaction.Connection != null);
        }


        #region IDisposable メン�?

        /// <summary>
        /// しっかり後処理しましょう�?
        /// </summary>
        void IDisposable.Dispose()
        {
            // トランザクションオブジェクト破棄
            if (_DbTransaction != null && _DbTransaction.Connection != null)
                _DbTransaction.Rollback();

            if (_DbTransaction != null)
                _DbTransaction.Dispose();

            _DbTransaction = null;

            // コネクションオブジェクト破棄
            if (_DbConnection != null && _DbConnection.State == ConnectionState.Open)
                _DbConnection.Close();

            if (_DbConnection != null)
                _DbConnection.Dispose();

            _DbConnection = null;
        }

        #endregion
    }
}
